共计 4407 个字符,预计需要花费 12 分钟才能阅读完成。
引入
1. 什么是 RESTful
- REST 与技术无关,它是一种 软件架构风格 ,REST 是 Representational State Transfer 的简称,中文翻译为“ 表征状态转移”
-
REST 从 资源的角度 类审视整个网络,它将分布在网络中某个节点的 资源通过 URL 进行标识 ,客户端应用 通过 URL 来获取资源 的表征,获得这些表征致使这些应用转变状态
-
所有的数据,不管是通过网络获取的还是操作 (增删改查) 的数据,都是资源,将一切数据视为资源 是 REST 区别与其他架构风格的最本质属性
-
对于 REST 这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)
一.Web 应用两种开发模式
1. 前后端不分离模式
- 也叫前后端混合开发模式, 需要后端写模板语言(dtl), 返回的是 HTML 页面
- 浏览器 : 请求动态页面
- 后端 : 返回 HTML
- 优点
可以直接渲染页面, 方便处理请求数据
- 缺点
耦合度非常高, 不方便扩展
2. 前后端分离模式
- 前端 : 只写前端
-
后端 : 只专注于写后端接口, 返回 json, xml 格式数据
-
流程 :
浏览器到静态文件服务器请求静态页面, 静态服务器返回静态页面
JS 请求达到后端, 后端再返回 JSON 或 XML 格式的数据
- 优点
不需要管前端怎么实现, 后端开发者需要做的就是写接口
只需要知道, 你前端传过来什么, 然后需要后端这边传回去什么就行了
- 主要的就是操作逻辑, 解耦合性高
- 缺点
程序员不知道前端的具体流程, 然后对表的设计, 对业务或许就理解的没有那么透彻
还存在前后端联调各种问题, 前端和后端的沟通等
二.API 接口和 RESTful API 规范
1.API 接口
- 规定了前后端信息交互规则的 url 连接, 也就是前后端交互的媒介
2. 为什么使用这个规范
- 为了在团队内部形成共识、防止个人习惯差异引起的混乱
- 我们需要找到一种大家都觉得很好的接口实现规范, 用途一目了然,减少双方之间的合作成本
3. 接口文档
- 书写接口的用途和使用方法, 数据格式等
- 可以手动书写, 或者使用工具自动生成(coreapi,swagger)
4.RESTful API 规范
一共有十条, 规定这么做, 但公司可以根据自己的需求改变
- 1.数据的安全保障, 通常使用 https 进行传输
# http 协议 + ssl 证书
# 使用 https 协议进行传输可以提高数据交互过程中的安全性
# 就算传输过程中被截获也需要 公钥 - 私钥 匹配才能得到数据
- 2.接口特征表现 : 域名中有 api 标识
# 尽量将 API 部署在专用域名, 看到 api 字眼, 就代表该请求 url 链接是完成前后台数据交互的
https://api.example.com
https://127.0.0.0:8080/api/
- 3.多版本 : 请求地址中带版本, 或者在请求头中
# v1,v2 代表不同版本
https://127.0.0.0:8080/api/v1/
https://127.0.0.0:8080/api/v2/
- 4.数据即资源, 均使用名词表示 (可以复数尽量不要用动词)
# 使用名词, 可以使用复数
https://api.example.com/v1/books/
# 不符合规范
https://api.example.com/v1/get_all_books
- 5.通过请求方式的不同来执行不同的操作
get : 获取数据
post : 新增数据
put : 全部更新
patch : 局部更新 (基本上都使用 put)
delete : 删除
# 示例 :
https://api.baidu.com/books - get 请求:获取所有书
https://api.baidu.com/books/1 - get 请求:获取主键为 1 的书
https://api.baidu.com/books - post 请求:新增一本书
https://api.baidu.com/books/1 - put 请求:整体修改主键为 1 的书
https://api.baidu.com/books/1 - patch 请求:局部修改主键为 1 的书
https://api.baidu.com/books/1 - delete 请求:删除主键为 1 的书
- 6.请求路径中带过滤, 在 url 后面带参数
https://api.example.com/v1/?name='金'&order=asc
https://api.example.com/v1/name?sortby=name&order=asc
- 7.返回数据中携带响应状态码
# 返回的 json 格式中放状态码, 标志当前请求成功或失败
2XX : 正常响应
3XX : 重定向响应
4XX : 客户端异常
5XX : 服务端异常
- 8.返回数据中携带错误信息
# 错误处理, error 当做 key, 错误信息当做 value
{error : '错误信息'}
- 9.针对不同操作, 返回数据符合如下规范(这只是规范)
GET /books:返回资源对象的列表(数组)[{},{},{}]
GET /books/1:返回单个资源对象 {}
POST /books:返回新生成的资源对象 {新增的书}
PUT /books/1:返回完整的资源对象 {返回修改后的}
PATCH /books/1:返回完整的资源对象 {返回修改后的}
DELETE /books/1:返回一个空文档
- 10.返回结果中携带资源连接
{
"name":"xxx 博客 ",
"url":"https://www.cnblogs.com/songhaixing/"
}
三. 接口测试工具 : Postman 与 Appizza
1. 工具地址
- Postman 是一款接口调试工具,是一款免费的可视化软件,同时支持各种操作系统平台,是测试接口的首选工具,官网:https://www.getpostman.com/downloads/ 下载进行安装
- Appizza 是 Web 版的接口测试工具,官网 : https://www.apizza.net/
ps : 接口测试工具不止这两种, 有很多:Postwoman ....
2.Postman 常用功能介绍
- get 请求:
- post 请求:
- 导出请求结果, 导到一个文件里面
- 导入请求文件
3.Apizza 界面
- 中文显示, 功能上与 Postman 使用没有很大的差别
四.Django-RESTful 介绍与安装
1. 介绍
- Django rest_framework, 简称 drf, 可以更方便的使用 django 写出符合 RESTful 规范的接口, (缩减编写 api 接口的代码)
- Django REST framework 是一个建立在 Django 基础之上的 Web 应用开发框架(Django 的一个 app),可以快速的开发 REST API 接口应用
- 在 REST framework 中,提供了序列化器 Serialzier 的定义,可以帮助我们简化序列化与反序列化的过程
- 不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作
- REST framework 还提供了认证、权限、限流、过滤、分页、接口文档等功能支持
- REST framework 提供了一个 API 的 Web 可视化界面来方便查看测试接口
2. 安装与快速使用(csrf 禁用状态)
- 安装 drf
pip3 install djangorestframework
- settings.py 文件中添加 app
INSTALLED_APPS = ['rest_framework']
- models.py 文件书写模型类
from django.db import models
class Book(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2)
author = models.CharField(max_length=16)
publish = models.CharField(max_length=16)
# 创建好模型类执行数据库迁移命令
- serializers.py 新建一个序列化类(该文件自己创建)
from rest_framework.serializers import ModelSerializer
from drf_test import models
class BookSerializers(ModelSerializer):
class Meta:
model = models.Book # 指明该序列化器处理的数据字段从模型类 Book 参考生成
fields = "__all__" # 指明该序列化器包含模型类中的哪些字段,’all‘指明包含所有字段
- views.py 书写视图类
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from drf_test.serializers import BookSerializers
from drf_test import models
class BookView(ModelViewSet):
serializer_class = BookSerializers # 指明该视图在进行序列化或反序列化时使用的序列化器
queryset = models.Book.objects.all() # 指明该视图集在查询数据时使用的查询集
- urls.py 书写路由关系
from django.contrib import admin
from django.urls import path
from rest_framework.routers import SimpleRouter
from drf_test import views
router = SimpleRouter() # 用来处理视图的路由器
router.register('book',views.BookView) # 在路由器中注册视图集
urlpatterns = [path('admin/', admin.site.urls),
]
urlpatterns += router.urls # 将路由器中的所有路由信息拼接到 Django 中的路由列表中
- 启动项目开始测试
期间遇到的一个问题 :
OrderedDict‘object has no attribute‘register‘
报错信息
- 原因是 markdown 的版本不兼容导致的问题,可以将 markdown 的版本安装到 3.2.1,问题即得到解决
python
pip3 install markdown==3.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
- POST : 添加一本书籍信息
- GET : 获取图书 (nid= 2 的书籍)
可以点击下面的输入框进行修改
- 点击 DELETE 删除书籍 (nid=2)